package cn.bearspark.happening.provider.dao.buffer;

import cn.bearspark.common.aop.autoparse.host.AutoParseHost;
import cn.bearspark.framework.redis.starter.buffer.hash.bi.RedisBiHashBuffer;
import cn.bearspark.happening.provider.dao.co.VoteOptionCO;
import cn.bearspark.happening.provider.dao.key.VoteBufferKeyBuilder;
import cn.bearspark.happening.provider.dao.mapper.VoteOptionMapper;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 投票选项的缓存器
 *
 * @author f
 */
@Component
public class VoteOptionBiHashBuffer extends RedisBiHashBuffer<VoteOptionCO> {

    /**
     * 投票选项数据的缓存的有效期（单位：s），默认是 5min
     */
    private static final int VOTE_OPTION_INFO_CACHE_EXPIRE = 60 * 5;

    /**
     * 投票选项简单信息的字段名集合，这些字段名是 VoteOptionCO 中的字段名
     */
    private final List<String> simpleInfoFieldNameList;

    public VoteOptionBiHashBuffer(RedisTemplate<String, Object> redisTemplate,
                                  VoteOptionMapper voteOptionMapper,
                                  VoteBufferKeyBuilder voteBufferKeyBuilder) {
        super(
                redisTemplate,
                VOTE_OPTION_INFO_CACHE_EXPIRE,
                VoteOptionCO.class,
                voteOptionMapper,
                voteBufferKeyBuilder
        );

        this.simpleInfoFieldNameList = List.of("optionId", "optionContent");
    }

    /**
     * 获取指定投票的指定选项 id 和 内容
     *
     * @param voteId       指定的投票 id
     * @param optionIdList 指定的选项 id 集合
     * @return 指定投票的指定选项 id 和 内容 的映射，key：选项 id，value：选项的内容
     */
    public Map<Integer, String> mapOptionIdContent(long voteId, List<Integer> optionIdList) {
        return super.mapLess(Map.of(voteId, new HashSet<>(optionIdList)), simpleInfoFieldNameList).get(voteId)
                .entrySet().stream().collect(Collectors.toMap(
                        Map.Entry::getKey, e -> e.getValue().getOptionContent()
                ));
    }

    /**
     * 获取指定投票的指定选项信息
     *
     * @param voteId       指定的投票 id
     * @param optionIdList 指定的选项 id 集合
     * @return 指定投票的指定选项信息映射，key：选项 id，value：选项的信息
     */
    @AutoParseHost(VoteOptionCO.class)
    public Map<Integer, VoteOptionCO> mapVoteOption(long voteId, List<Integer> optionIdList) {
        return super.map(Map.of(voteId, new HashSet<>(optionIdList))).get(voteId);
    }
}
